package com.shiyi.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

/**
 * REST即表述性状态传递（英文：Representational State Transfer，简称REST）是Roy Fielding博士在2000年他的博士论文中提出来的一种[软件架构](https://baike.baidu.com/item/软件架构)风格。
 * 它是一种针对[网络应用](https://baike.baidu.com/item/网络应用/2196523)的设计和开发方式，可以降低开发的复杂性，提高系统的可伸缩性。
 *
 * 表现层（Representation）：把资源具体呈现出来的形式，因此叫做表现层。
 * 资源（Resource）：网络上的一个具体信息，文本，图片，音频，视频都可以称之为资源，如果想要访问到互联网上的某一个资源，那么就必须要使用一个URL来唯一性的获取改资源，也可以这么说，URL是每一个资源的唯一标识符。
 * 状态转化（State Transfer）：当客户端发出一个请求的时候，就代表客户端跟服务端的一次交互过程，HTTP是一种无状态协议，即所有的状态都保存在服务器端，
 * 因此，客户端如果想要操作服务器，必须通过某些手段，让服务器的状态发生转化，而这种转化是建立在表现层的，这就是名字的由来
 *
 * 我们在获取资源的时候就是进行增删改查的操作，如果是原来的架构风格，需要发送四个请求，分别是：
 *      查询：localhost:8080/query?id=1
 *      增加：localhost:8080/save
 *      删除：localhost:8080/delete?id=1
 *      更新：localhost:8080/update?id=1
 * 照此方式发送请求的时候比较麻烦，需要定义多种请求，而在HTTP协议中，有不同的发送请求的方式，分别是GET、POST、PUT、DELETE等，我们如果能让不同的请求方式表示不同的请求类型就可以简化我们的查询
 *      GET：获取资源   	    /book/1
 *      POST：新建资源		/book
 *      PUT：更新资源		/book/1
 *      DELETE：删除资源		/book/1
 * 一切看起来都非常美好，但是大家需要注意了，我们在发送请求的时候只能发送post或者get，没有办法发送put和delete请求，那么应该如何处理呢？下面开始进入代码环节：
 * @author qiu
 * @date 2021-01-17 下午 10:57
 * @since 1.0
 */
@Controller
@RequestMapping("/restful")
public class RestFulController {

    @PostMapping("/save")
    public String save() {
        System.out.println("save...");
        return "success";
    }

    @PutMapping("/update/{id}")
    public String update(@PathVariable("id") Integer id) {
        System.out.println("update... id: " + id);
        return "success";
    }

    @GetMapping("/query/{id}")
    public String query(@PathVariable("id") Integer id) {
        System.out.println("query... id: " + id);
        return "success";
    }

    @DeleteMapping("/delete/{id}")
    public String delete(@PathVariable("id") Integer id) {
        System.out.println("delete... id: " + id);
        return "success";
    }
}
